package cn.iocoder.yudao.module.social.dal.mysql.content;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.social.controller.admin.content.vo.ContentPageReqVO;
import cn.iocoder.yudao.module.social.dal.dataobject.content.ContentDO;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * 内容 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface ContentMapper extends BaseMapperX<ContentDO> {

    default PageResult<ContentDO> selectPage(ContentPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<ContentDO>()
                .eqIfPresent(ContentDO::getAuthorId, reqVO.getAuthorId())
                .eqIfPresent(ContentDO::getContainerId, reqVO.getContainerId())
                .eqIfPresent(ContentDO::getPlanetId, reqVO.getPlanetId())
                .likeIfPresent(ContentDO::getTitle, reqVO.getTitle())
                .eqIfPresent(ContentDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(ContentDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(ContentDO::getId));
    }

    default List<ContentDO> selectListByAuthorId(Long authorId) {
        return selectList(new LambdaQueryWrapperX<ContentDO>()
                .eq(ContentDO::getAuthorId, authorId)
                .orderByDesc(ContentDO::getCreateTime));
    }

    default List<ContentDO> selectListByAuthorIdAndPlanetId(Long authorId, Long planetId) {
        return selectList(new LambdaQueryWrapperX<ContentDO>()
                .eq(ContentDO::getAuthorId, authorId)
                .eq(ContentDO::getPlanetId, planetId)
                .orderByDesc(ContentDO::getCreateTime));
    }

    default List<ContentDO> selectListByContainerId(Long containerId) {
        return selectList(new LambdaQueryWrapperX<ContentDO>()
                .eq(ContentDO::getContainerId, containerId)
                .eq(ContentDO::getStatus, 1) // 只查询已发布的内容
                .orderByDesc(ContentDO::getCreateTime));
    }

    default List<ContentDO> selectListByContainerIdAndPlanetId(Long containerId, Long planetId) {
        return selectList(new LambdaQueryWrapperX<ContentDO>()
                .eq(ContentDO::getContainerId, containerId)
                .eq(ContentDO::getPlanetId, planetId)
                .eq(ContentDO::getStatus, 1) // 只查询已发布的内容
                .orderByDesc(ContentDO::getCreateTime));
    }

    default List<ContentDO> selectListByStatus(Integer status) {
        return selectList(new LambdaQueryWrapperX<ContentDO>()
                .eq(ContentDO::getStatus, status)
                .orderByDesc(ContentDO::getCreateTime));
    }

    default Long selectCountByAuthorId(Long authorId) {
        return selectCount(new LambdaQueryWrapperX<ContentDO>()
                .eq(ContentDO::getAuthorId, authorId));
    }

    default Long selectCountByContainerId(Long containerId) {
        return selectCount(new LambdaQueryWrapperX<ContentDO>()
                .eq(ContentDO::getContainerId, containerId)
                .eq(ContentDO::getStatus, 1)); // 只统计已发布的内容
    }

    default Long selectCountByContainerIdAndPlanetId(Long containerId, Long planetId) {
        return selectCount(new LambdaQueryWrapperX<ContentDO>()
                .eq(ContentDO::getContainerId, containerId)
                .eq(ContentDO::getPlanetId, planetId)
                .eq(ContentDO::getStatus, 1)); // 只统计已发布的内容
    }


    default PageResult<ContentDO> selectPageByPlanetId(ContentPageReqVO reqVO, Long planetId) {
        return selectPage(reqVO, new LambdaQueryWrapperX<ContentDO>()
                .eq(ContentDO::getPlanetId, planetId)
                .eqIfPresent(ContentDO::getAuthorId, reqVO.getAuthorId())
                .eqIfPresent(ContentDO::getContainerId, reqVO.getContainerId())
                .likeIfPresent(ContentDO::getTitle, reqVO.getTitle())
                .eqIfPresent(ContentDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(ContentDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(ContentDO::getId));
    }

}
